package com.example.bourse.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.bourse.controller.admin.AdminController;
import com.example.bourse.core.result.PageResult;
import com.example.bourse.core.utils.StringUtils;
import com.example.bourse.mapper.AdminUserMapper;
import com.example.bourse.pojo.dto.RoleDto;
import com.example.bourse.pojo.entity.AdminUser;
import com.example.bourse.pojo.entity.Activity;
import com.example.bourse.service.AdminUserService;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.data.annotation.Tran;

import java.util.List;
import java.util.ArrayList;

/**
 * 后台用户服务实现类
 * 实现AdminUserService接口，提供用户管理相关功能
 */
@Component
public class AdminUserServiceImpl implements AdminUserService {

    /**
     * 用户数据访问接口
     */
    @Db
    private AdminUserMapper adminUserMapper;

    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 用户实体
     */
    @Override
    public AdminUser getUserByUsername(String username) {
        return adminUserMapper.selectByUsername(username);
    }

    /**
     * 添加新用户
     * @param user 用户信息
     */
    @Override
    public void addUser(AdminUser user) {
        adminUserMapper.insert(user);
    }

    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 用户实体
     */
    @Override
    public AdminUser login(String username, String password) {
        AdminUser user = adminUserMapper.selectByUsername(username);
        if (user == null || !user.getPassword().equals(password)) {
            return null;
        }
        StpUtil.login(user.getId());
        return user;
    }

    /**
     * 根据ID获取用户
     * @param id 用户ID
     * @return 用户实体
     */
    @Override
    public AdminUser getUserById(long id) {
        return adminUserMapper.selectById(id);
    }

    /**
     * 获取用户总数
     * @return 用户数量
     */
    @Override
    public long count() {
        return adminUserMapper.count();
    }

    /**
     * 获取所有用户
     * @return 用户列表
     */
    @Override
    public List<AdminUser> selectAll() {
        return adminUserMapper.selectAll();
    }

    /**
     * 分页获取用户列表
     * @param page 页码
     * @param username 用户名（可选）
     * @return 分页结果
     */
    @Override
    public PageResult<AdminUser> listUsers(int page, String username) {
        QueryWrapper<AdminUser> wrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(username)) {
            wrapper.like("username", username);
        }
        
        int pageSize = 10;
        Page<AdminUser> pageResult = new Page<>(page, pageSize);
        IPage<AdminUser> result = adminUserMapper.selectPage(pageResult, wrapper);
        
        return new PageResult<>(
            result.getRecords(),
            (int)result.getCurrent(),
            (int)result.getPages(),
            result.getTotal()
        );
    }

    /**
     * 更新用户信息
     * @param user 用户信息
     */
    @Tran
    @Override
    public void updateUser(AdminUser user) {
        adminUserMapper.updateById(user);
    }

    /**
     * 删除用户
     * @param userId 用户ID
     */
    @Tran
    @Override
    public void deleteUser(long userId) {
        adminUserMapper.deleteById(userId);
    }

    /**
     * 获取用户列表
     * @return 用户列表
     */
    @Override
    public List<AdminUser> getUsers() {
        return adminUserMapper.selectAll();
    }

    /**
     * 获取用户总数
     * @return 用户数量
     */
    @Override
    public long getUserCount() {
        return adminUserMapper.count();
    }

    /**
     * 获取角色总数
     * @return 角色数量
     */
    @Override
    public int getRoleCount() {
        return adminUserMapper.countRoles();
    }

    /**
     * 获取菜单总数
     * @return 菜单数量
     */
    @Override
    public int getMenuCount() {
        return adminUserMapper.countMenus();
    }

    /**
     * 获取用户角色
     * @param userId 用户ID
     * @return 角色列表
     */
    @Override
    public List<RoleDto> getUserRoles(Long userId) {
        return adminUserMapper.selectUserRoles(userId);
    }

    /**
     * 保存用户角色
     * @param userId 用户ID
     * @param roles 角色ID列表
     */
    @Override
    public void saveUserRoles(Long userId, List<Long> roles) {
        adminUserMapper.deleteUserRoles(userId);
        adminUserMapper.insertUserRoles(userId, roles);
    }

    @Override
    public long getTodayUserCount() {
        return adminUserMapper.countTodayUsers();
    }

    @Override
    public long getPendingOrderCount() {
        return adminUserMapper.countPendingOrders();
    }

    @Override
    public long getSystemMessageCount() {
        return adminUserMapper.countSystemMessages();
    }

    @Override
    public List<Activity> getRecentActivities() {
        return adminUserMapper.selectRecentActivities();
    }
}
